﻿using System;
using System.ComponentModel;

namespace RiskMan.DataClass.Models.Plaza_II
{
    /// <summary>
    /// Таблица 22. Поля таблицы orders_aggr -  Агрегированные стаканы
    /// Таблица содержит список агрегированных котировок. Каждая агрегированная котировка является
    ///результатом суммирования по объёму активных заявок с одинаковыми инструментом, ценой и
    ///направлением.
    ///Режимы использования таблицы в зависимости от режимов работы торговой системы:
    ///• Ночной период - таблицы содержат данные на момент завершения вечерней сессии
    ///• Торговая сессия до пром. клиринга - таблица обновляется активными заявками
    ///• Пром. клиринг - таблица не обновляется и содержит данные на момент начала пром. клиринга
    ///• Торговая сессия после пром. клиринга - таблица обновляется активными заявками
    ///• Клиринг - таблица очищается
    ///• Вечерняя торговая сессия - таблица обновляется активными заявками вечерней сессии
    /// </summary>
    public class OrdersAggr : INotifyPropertyChanged
    {

        #region private

        private long _replId;
        private long _replRev;
        private long _replAct;
        private int _isinID;
        private double _price;
        private long _volume;
        private DateTime _moment;
        private int _dir;

        #endregion

        #region public

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplId
        {
            get { return _replId; }
            set
            {
                if (_replId != value)
                {
                    _replId = value;
                    RaisePropertyChanged("ReplId");
                }
            }
        }

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplRev
        {
            get { return _replRev; }
            set
            {
                if (_replRev != value)
                {
                    _replRev = value;
                    RaisePropertyChanged("ReplRev");
                }
            }
        }

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplAct
        {
            get { return _replAct; }
            set
            {
                if (_replAct != value)
                {
                    _replAct = value;
                    RaisePropertyChanged("ReplAct");
                }
            }
        }

        /// <summary>
        /// Уникальный числовой идентификатор инструмента
        /// </summary>
        public int IsinID
        {
            get { return _isinID; }
            set
            {
                if (_isinID != value)
                {
                    _isinID = value;
                    RaisePropertyChanged("IsinID");
                }
            }
        }

        /// <summary>
        /// Цена котировки
        /// </summary>
        public double Price
        {
            get { return _price; }
            set
            {
                if (_price != value)
                {
                    _price = value;
                    RaisePropertyChanged("Price");
                }
            }
        }

        /// <summary>
        /// Объем агрегированной котировки
        /// • Записи в таблице могут обновляться полностью, т.е. обновляться может не только объём котировки
        ///(volume), но и инструмент, цена, направление. В случае наступления такого события считается, что
        ///предыдущая котировка вышла из стакана, а новая – появилась.
        ///• В таблице могут присутствовать записи с нулевым объёмом (volume = 0). Такие записи следует
        ///игнорировать. При этом, может происходит обнуление существующей котировки – это означает, что
        ///котировка вышла из стакана или заполнение нулевой котировки какими либо значениями – это означает,
        ///что котировка с новыми значениями вошла в стакан.
        /// </summary>
        public long Volume
        {
            get { return _volume; }
            set
            {
                if (_volume != value)
                {
                    _volume = value;
                    RaisePropertyChanged("Volume");
                }
            }
        }

        /// <summary>
        /// Время последнего обновления котировки
        /// </summary>
        public DateTime Moment
        {
            get { return _moment; }
            set
            {
                if (_moment != value)
                {
                    _moment = value;
                    RaisePropertyChanged("Moment");
                }
            }
        }

        /// <summary>
        /// Направление котировки
        /// </summary>
        public int Dir
        {
            get { return _dir; }
            set
            {
                if (_dir != value)
                {
                    _dir = value;
                    RaisePropertyChanged("Dir");
                }
            }
        }

        #endregion
        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion
    }
}
